// 数组迭代器
var eachArray = function(arr, fn) {
	var i = 0,
		len = arr.length;
	// 遍历数组
	for (; i < len; i++) {
		// 依次执行回调函数，注意回调函数中传入的参数第一个为索引，第二个为值
		if (fn.call(arr[i], i, arr[i]) === false) {
			break;
		}
	}
}
// 测试
for (var arr = [], i = 0; i < 5; arr[i++] = i);
eachArray(arr, function(i, data) {
	console.log(i, data);
});

// 对象迭代器
var eachObject = function(obj, fn) {
	// 遍历对象的每一个属性
	for (var i in obj) {
		// 依次执行回调函数
		if (fn.call(obj[i], i, obj[i]) === false) {
			break;
		}
	}
}
// 测试
var obj = {a: 23, b: 35, c: 46};
eachObject(obj, function(i, data) {
	console.log(i, data);
});

// 对象迭代器
// 测试对象
var obj = {
	// 所有用户共享
	common: {},
	// 客户端数据
	client: {
		user: {
			username: '雨夜清荷',
			uid: '123'
		}
	},
	// 服务端数据
	server: {}
}
// 对象迭代取值器
var AttrGetter = function(obj, key) {
	// 如果不存在A，则返回未定义
	if (!obj) return undefined;
	key = key.split('.');		// 解析层次关系
	// 迭代同步变量A对象属性
	for (var i = 0, len = key.length; i < len - 1; i++) {
		if (obj[key[i]] !== undefined) {
			obj = obj[key[i]];
		} else {
			return undefined;
		}
	}
	return obj;
}
// 获取用户名
console.log( AttrGetter(obj, 'client.user.username') );
// 获取本地语言数据
console.log( AttrGetter(obj, 'server.lang.local') );

// 对象迭代赋值器
var AttrSetter = function(obj, key, val) {
	// 如果不存在，则返回未定义
	if (!obj) return undefined;
	obj_tmp = obj;
	key = key.split('.');
	for (var i = 0, len = key.length; i < len - 1; i++) {
		if (obj_tmp[key[i]] === undefined) {
			obj_tmp[key[i]] = {};
		}
		if (!(obj_tmp[key[i]] instanceof Object)) {
			throw new Error(key.splice(0, i + 1).join('.') + ' is not Object');
			return false;
		}
		obj_tmp = obj_tmp[key[i]];
	}
	return obj_tmp[key[i]] = val;
}
// 测试
console.log( AttrSetter(obj, 'client.module.news.sports', 'on') );
console.log(obj);
// 错误演示
console.log( AttrSetter(obj, 'client.user.username.sports', 'on') );
